package dao;

import dto.DTOCliente;
import java.util.Vector;
import entidades.Cliente;

/**
 * Clase de la capa de Persistencia, encargada de recuperar y almacenar objetos
 * Cliente en la base de datos.
 * 
 */
public class DAOCliente extends DAO {

    /**
     * Retorna el vector de objetos Cliente cargadas en la base de datos.
     *
     * @return El vector de objetos Cliente, null si no existe
     */
    public static Vector<Cliente> getAll() {
        return getAll("Cliente");
    }

    /**
     * Busca en la base de datos los Clientes que responden a los criterios de
     * búsqueda del DTOCliente.
     * 
     * @param criterios:    conjunto de parámetros que serán utilizados para 
     *                      confeccionar la consulta. Si algun parámetro es 
     *                      nulo, se considera que no se realiza una búsqueda 
     *                      por el mismo.
     * 
     * @return  Vector de Clientes que responden a los criterios de búsqueda
     */
    public static Vector<Cliente> filtrarClientes(DTOCliente criterios) 
    {
    	String query = "Cliente ";
	boolean tiene_una_condicion = false;

	if(criterios.getIdLocalidad() != -1) {
            query += " where ";
            tiene_una_condicion = true;
            query += "localidad.idLocalidad = "+criterios.getIdLocalidad();
	}
	else
            if(criterios.getIdProvincia() != -1) {
		query += " where ";
		tiene_una_condicion = true;
		query += " (localidad.provincia.idProvincia = "+ criterios.getIdProvincia() +")";
            }

        if (!criterios.getNumDoc().isEmpty()) {
            if(tiene_una_condicion) {
                query += " and ";
            }
            else {
                query += " where ";
		tiene_una_condicion = true;
            }
            query += " tipoDoc = '"+ criterios.getTipoDoc() +"'";
            query += " and numDoc = '"+ criterios.getNumDoc() +"'";
        }
      
	if(!criterios.getNombre().isEmpty()) {
            if(tiene_una_condicion) {
                query += " and ";
            }
            else {
            	query += " where ";
		tiene_una_condicion = true;
            }

            query += " nombre LIKE '%"+criterios.getNombre()+"%'";
	}

	if(!criterios.getApellido().isEmpty()) {
            if(tiene_una_condicion) {
		query += " and ";
            }
            else {
            	query += " where ";
		tiene_una_condicion = true;
            }

            query += " apellido LIKE '%"+criterios.getApellido()+"%'";
	}
        
        return DAO.getAll(query);
    }
    
    /**
     * Obtiene el primer cliente que tenga el número de documento especificado
     * 
     * @param num_doc   Un número de documento
     * 
     * @return Cliente  Primer entidad que coincide con la búsqueda. 
     *                  Null si no encuentra ningún cliente que coincida con la búsqueda.                 
     */
    public static Cliente getByNumDoc(String num_doc) {
        Vector<Cliente> clientes = DAO.getAll("Cliente where numDoc = '"+num_doc+"'");
        
        if(!clientes.isEmpty()) 
            return clientes.get(0);

        return null;
    }

    /**
     * Inserta (persiste) un cliente en la base de datos
     * 
     * @param c Cliente Cliente que se desea persistir
     * @return boolean  true si la inserción fue exitosa, false en caso contrario
     */
    public static boolean insert(Cliente c) {
        return guardarOActualizarObjeto(c);
    }

    /**
     * Borra (elimina) un cliente en la base de datos
     * 
     * @param c Cliente Cliente que se desea borrar
     * 
     * @return boolean  true si la eliminación fue exitosa, false en caso contrario
     */
    public static boolean delete(Cliente c) {
        return eliminarObjeto(c);
    }
    
    /**
    * Retorna el String correspondiente al tipo de inmueble
    * que el cliente desea, el cual es seleccionado mediante un combobox
    * 
    *   @param cbIndex indice del combobox del tipo de inmueble seleccionado 
    *   @return String correspondiente a los diferentes tipos de inmueble:
    *           - L (Local-Oficina)
    *           - C (Casa)
    *           - D (Departamento)
    *           - T (Terreno)
    *           - Q (Quinta)
    *           - G (Galpón)
    *
    * 
    * @version 29/11/2013
    */
    public static String setInmuebleTipoEnum(int cbIndex) {
        String inmuebleTipo = null;
        switch (cbIndex){
            case 0:
                inmuebleTipo="L";
                break;
                
            case 1:
                inmuebleTipo="C";
                break;
                
            case 2:
                inmuebleTipo="D";
                break;
                
            case 3:
                inmuebleTipo="T";
                break;
                
            case 4:
                inmuebleTipo="Q";
                break;
                
            case 5:
                inmuebleTipo="G";
        }
        return inmuebleTipo;
    }
    
    /**
    * Retorna el tipo de inmueble correspondiente al string pasado
    * como paramentro
    * 
    *   @param inmuebleTipo String el cual se solicita saber a que tipo de inmueble corresponde
    *   @return TipoInmueble correspondiente
    *           - L (LOCAL_OFICINA)
    *           - C (CASA)
    *           - D (DEPARTAMENTO)
    *           - T (TERRENO)
    *           - Q (QUINTA)
    *           - G (GALPON)
    *
    * 
    * @version 29/11/2013
    */
    public static DAOInmueble.TipoInmueble getInmuebleTipoEnum(String inmuebleTipo) {
        if (inmuebleTipo.equals("L"))
            return DAOInmueble.TipoInmueble.LOCAL_OFICINA;
        
        if ("C".equals(inmuebleTipo))
            return DAOInmueble.TipoInmueble.CASA;
        
        if (inmuebleTipo.equals("D"))
            return DAOInmueble.TipoInmueble.DEPARTAMENTO;
        
        if ("T".equals(inmuebleTipo))
            return DAOInmueble.TipoInmueble.TERRENO;
        
        if ("Q".equals(inmuebleTipo))
            return DAOInmueble.TipoInmueble.QUINTA;
        
        if ("G".equals(inmuebleTipo))
            return DAOInmueble.TipoInmueble.GALPON;
        
        return null;
    }
    
    /**
     * Genera un nuevo vector que contiene tantas columnas como tenga la tabla donde
     * se van a listar los clientes. Esto facilita la inserción de filas en la tabla.
     * 
     * @param c Cliente Cliente del que se desea obtener el vector con los datos
     * @return Vector   Arreglo con los datos que se deben incorporar en la fila de la tabla
     */
    public static Vector convertirClienteParaMostrarEnTabla(Cliente c) {
        Vector cliente = new Vector();
        
        cliente.add(c.getNumDoc());
        cliente.add(c.getApellido()+ ", " + c.getNombre());
        cliente.add(c.getLocalidadByIdLocalidad().getNombre() + " (" + c.getLocalidadByIdLocalidad().getProvincia().getNombre() + ")");
        
        return cliente;
    }
}
